{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e9e103bc-1f9b-4348-bf17-09d2d32fed07",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Imports \n",
    "# Env var\n",
    "import os \n",
    "import sys\n",
    "import markdownify\n",
    "\n",
    "from dotenv import load_dotenv, find_dotenv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "53539806-a791-4264-8cab-b72883e29c64",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Env variable\n",
    "sys.path.append('../')\n",
    "load_dotenv(find_dotenv())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33438b7e-e989-412e-87e3-e12eb7401846",
   "metadata": {},
   "source": [
    "# 1. Confluence Loader "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ed22f7b3-5e5e-41fe-a583-e6393609e716",
   "metadata": {},
   "outputs": [],
   "source": [
    "from config import (CONFLUENCE_SPACE_NAME, CONFLUENCE_SPACE_KEY,\n",
    "                    CONFLUENCE_USERNAME, CONFLUENCE_API_KEY, PERSIST_DIRECTORY)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dc19ab73-5f9d-4f0d-a80d-c49d502d9fc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.document_loaders import ConfluenceLoader\n",
    "loader = ConfluenceLoader(\n",
    "    url=CONFLUENCE_SPACE_NAME,\n",
    "    username=CONFLUENCE_USERNAME,\n",
    "    api_key=CONFLUENCE_API_KEY\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "103b9b37-255f-4b76-ad4e-8e8af459b027",
   "metadata": {},
   "outputs": [],
   "source": [
    "docs = loader.load(\n",
    "    space_key=CONFLUENCE_SPACE_KEY,\n",
    "    limit=10,\n",
    "    # include_attachments=True, # uncomment to include png, jpeg, ..\n",
    "    max_pages=50,\n",
    "    keep_markdown_format=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3c7028f0-6923-40bd-bddd-6bcb94302540",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Content: \n",
      " ------- \n",
      "## Qu'est-ce qu'un Comité d'Entreprise ?\n",
      "\n",
      "Le Comité d'Entreprise (CE) est une institution représentative du personnel présente dans les entreprises françaises. Il a été créé pour assurer la représentation des salariés et leur permettre de participer activement aux décisions concernant leur vie au sein de l'entreprise. Le Comité d'Entreprise est obligatoire dans les entreprises de certaines tailles et ses missions sont définies par le Code du Travail.\n",
      "\n",
      "## Comment accéder à mon CE ?\n",
      "\n",
      "Pour accéder au CE, vous pouvez consultant l’adresse suivante: <https://mon-CE.fr>\n",
      "\n",
      "Si vous n’avez pas vos identifiants, vous pouvez envoyer un mail à [xxxx@mon-ce.fr](mailto:xxxx@mon-ce.fr), le responsable du comité d’entreprise. \n",
      "\n",
      "Renseignez les identifiants sur le site du CE et vous pourrez bénéficier de nombreux avantages.\n",
      "\n",
      "## Rôle du Comité d'Entreprise :\n",
      "\n",
      "Le Comité d'Entreprise joue un rôle essentiel dans le dialogue social au sein de l'entreprise. Ses principales missions sont les suivantes :\n",
      "\n",
      "### 1. Défense des droits des salariés :\n",
      "\n",
      "Le Comité d'Entreprise est chargé de veiller au respect des droits des salariés en matière de travail, de sécurité, de santé et de conditions de travail. Il peut être consulté par la direction de l'entreprise sur différentes questions liées à l'organisation du travail, aux licenciements collectifs, aux restructurations, etc. Il est également informé des projets de l'entreprise et peut émettre des avis.\n",
      "\n",
      "### 2. Gestion des activités sociales et culturelles :\n",
      "\n",
      "Le CE a un rôle actif dans la mise en place d'activités sociales et culturelles au bénéfice des salariés et de leur famille. Cela peut inclure des événements sportifs, culturels, des voyages, des réductions pour des loisirs, des services d'aide à la personne, etc. Ces activités contribuent à améliorer le bien-être des salariés et renforcent la cohésion au sein de l'entreprise.\n",
      "\n",
      "### 3. Consultation sur les orientations économiques et financières :\n",
      "\n",
      "Le Comité d'Entreprise doit être consulté sur les orientations économiques et financières de l'entreprise. Lors de ces consultations, il reçoit des informations sur la situation économique de l'entreprise, les perspectives d'évolution, les investissements envisagés, etc. Ces échanges permettent aux représentants du personnel de prendre part aux décisions stratégiques.\n",
      "\n",
      "### 4. Gestion des œuvres sociales et culturelles :\n",
      "\n",
      "Le CE peut gérer un budget destiné à financer ses différentes activités sociales et culturelles. Il établit un plan d'action pour définir les activités à mettre en place et les moyens à allouer à chacune d'elles. La gestion de ce budget doit être transparente et soumise à des règles strictes.\n",
      "\n",
      "### 5. Représentation des salariés :\n",
      "\n",
      "Le Comité d'Entreprise représente les intérêts des salariés auprès de la direction de l'entreprise. Il est un lieu d'échange et de dialogue entre les employés et l'employeur, favorisant ainsi un climat social constructif.\n",
      "\n",
      "\n",
      "Metadatas: \n",
      " ------- \n",
      "{'title': \"Comité d'entreprise (CE) - Définition et rôles\", 'id': '1933313', 'source': 'https://florianbastin.atlassian.net/wiki/spaces/~70121e1c1cf2b203a49dabc6762c43bdbfe05/pages/1933313'}\n"
     ]
    }
   ],
   "source": [
    "# Look at one page content and its metadata\n",
    "print(\"Content: \\n ------- \\n\" + docs[-1].page_content)\n",
    "print(\"Metadatas: \\n ------- \\n\" + str(docs[-1].metadata))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9ded8289-b075-4ac8-aee9-b5a06230e4a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "def pretty_print(chunks):\n",
    "    print(\n",
    "        str('\\n' + '='*50 + '\\n').join(\n",
    "            [\n",
    "                chunk.page_content + '\\n' +'-'*50 + '\\n' + str(chunk.metadata) \n",
    "                for chunk in chunks\n",
    "            ]\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "954f5814-648b-46c4-9868-180c66bc7ee8",
   "metadata": {},
   "source": [
    "## 2. Document Splitter "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d19407e7-5052-497d-b804-4c9e496303f5",
   "metadata": {},
   "source": [
    "### Document Example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f796d3d7-fd19-4939-8988-cb79b9dcaa34",
   "metadata": {},
   "outputs": [],
   "source": [
    "import langchain\n",
    "text = \"\"\"\n",
    "# Je suis un titre \n",
    "## Je suis un sous-titre\n",
    "\n",
    "Je suis un bloc de texte. Cependant, ma taille est assez longue. J'aimerais dans un premier temps que le MarkdownHeaderTextSplitter\n",
    "identifie mon titre et sous-titre dans ses métadonnées.\n",
    "\n",
    "Je souhaite ensuite que RecursiveCharacterTextSplitter identifie les deux parties qui me composent \n",
    "car ma taille serait trop volumineuse pour alimenter un modèle de langue. \n",
    "\n",
    "Enfin j'aimerais que les métadatas correspondant à mes origines, à savoir l'url, soit mergées avec mes informations\n",
    "de titre et sous titres.\n",
    "\"\"\"\n",
    "\n",
    "metadata={'url': 'https://mon_origine.com'}\n",
    "\n",
    "sample = langchain.schema.document.Document(page_content=text, metadata=metadata)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d850685e-1ab8-4bfc-a3ba-51dc10c3ceff",
   "metadata": {},
   "source": [
    "### MarkdownHeaderTextSplitter example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "04e97186-9770-4306-a7a3-b6c27e355af9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Document(page_content=\"Je suis un bloc de texte. Cependant, ma taille est assez longue. J'aimerais dans un premier temps que le MarkdownHeaderTextSplitter\\nidentifie mon titre et sous-titre dans ses métadonnées.  \\nJe souhaite ensuite que RecursiveCharacterTextSplitter identifie les deux parties qui me composent\\ncar ma taille serait trop volumineuse pour alimenter un modèle de langue.  \\nEnfin j'aimerais que les métadatas correspondant à mes origines, à savoir l'url, soit mergées avec mes informations\\nde titre et sous titres.\", metadata={'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre'})]\n"
     ]
    }
   ],
   "source": [
    "from langchain.text_splitter import MarkdownHeaderTextSplitter\n",
    "\n",
    "# Markdown \n",
    "headers_to_split_on = [\n",
    "    (\"#\", \"Titre 1\"),\n",
    "    (\"##\", \"Sous-titre 1\"),\n",
    "    (\"###\", \"Sous-titre 2\"),\n",
    "]\n",
    "\n",
    "# Markdown splitter\n",
    "markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n",
    "chunks = markdown_splitter.split_text(sample.page_content)\n",
    "\n",
    "print(chunks)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1073d0b9-807f-4768-8e07-674b14474cb6",
   "metadata": {},
   "source": [
    "### RecursiveCharacterTextSplitter example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "50ac8082-4847-4d8d-87f3-784950c5a03c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Je suis un bloc de texte. Cependant, ma taille est assez longue. J'aimerais dans un premier temps que le MarkdownHeaderTextSplitter\n",
      "identifie mon titre et sous-titre dans ses métadonnées.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre'}\n",
      "==================================================\n",
      "Je souhaite ensuite que RecursiveCharacterTextSplitter identifie les deux parties qui me composent\n",
      "car ma taille serait trop volumineuse pour alimenter un modèle de langue.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre'}\n",
      "==================================================\n",
      "Enfin j'aimerais que les métadatas correspondant à mes origines, à savoir l'url, soit mergées avec mes informations\n",
      "de titre et sous titres.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre'}\n"
     ]
    }
   ],
   "source": [
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "splitter = RecursiveCharacterTextSplitter(\n",
    "    chunk_size=256,\n",
    "    chunk_overlap=20,\n",
    "    separators=[\"#\", \"\\n\\n\", \"\\n\", \"(?<=\\. )\", \" \", \"\"]\n",
    ")\n",
    "\n",
    "splitted_chunks = splitter.split_documents(chunks)\n",
    "\n",
    "pretty_print(splitted_chunks)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e305dc2-cc44-4946-ac32-3da1366f802c",
   "metadata": {},
   "source": [
    "### MarkdownHeaderTextSplitter & RecursiveCharacterTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7993fabc-5213-4e2e-b280-e8eaadfc11b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Je suis un bloc de texte. Cependant, ma taille est assez longue. J'aimerais dans un premier temps que le MarkdownHeaderTextSplitter\n",
      "identifie mon titre et sous-titre dans ses métadonnées.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre', 'url': 'https://mon_origine.com'}\n",
      "==================================================\n",
      "Je souhaite ensuite que RecursiveCharacterTextSplitter identifie les deux parties qui me composent\n",
      "car ma taille serait trop volumineuse pour alimenter un modèle de langue.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre', 'url': 'https://mon_origine.com'}\n",
      "==================================================\n",
      "Enfin j'aimerais que les métadatas correspondant à mes origines, à savoir l'url, soit mergées avec mes informations\n",
      "de titre et sous titres.\n",
      "--------------------------------------------------\n",
      "{'Titre 1': 'Je suis un titre', 'Sous-titre 1': 'Je suis un sous-titre', 'url': 'https://mon_origine.com'}\n"
     ]
    }
   ],
   "source": [
    "# Markdown \n",
    "headers_to_split_on = [\n",
    "    (\"#\", \"Titre 1\"),\n",
    "    (\"##\", \"Sous-titre 1\"),\n",
    "    (\"###\", \"Sous-titre 2\"),\n",
    "]\n",
    "\n",
    "markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n",
    "\n",
    "# Split based on markdown and add original metadata\n",
    "md_docs = []\n",
    "for doc in [sample]:\n",
    "    md_doc = markdown_splitter.split_text(doc.page_content)\n",
    "    for i in range(len(md_doc)):\n",
    "        md_doc[i].metadata = md_doc[i].metadata | doc.metadata \n",
    "    md_docs.extend(md_doc)\n",
    "\n",
    "# RecursiveTextSplitter\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "# Chunk size big enough\n",
    "splitter = RecursiveCharacterTextSplitter(\n",
    "    chunk_size=256,\n",
    "    chunk_overlap=20,\n",
    "    separators=[\"\\n\\n\", \"\\n\", \"(?<=\\. )\", \" \", \"\"]\n",
    ")\n",
    "\n",
    "splitted_docs = splitter.split_documents(md_docs)\n",
    "\n",
    "pretty_print(splitted_docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3b05a633-b710-4570-8e2c-3893c2b38d85",
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_custom_splitter(docs):\n",
    "    # Markdown \n",
    "    headers_to_split_on = [\n",
    "        (\"#\", \"Titre 1\"),\n",
    "        (\"##\", \"Sous-titre 1\"),\n",
    "        (\"###\", \"Sous-titre 2\"),\n",
    "    ]\n",
    "    \n",
    "    markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)\n",
    "    \n",
    "    # Split based on markdown and add original metadata\n",
    "    md_docs = []\n",
    "    for doc in docs:\n",
    "        md_doc = markdown_splitter.split_text(doc.page_content)\n",
    "        for i in range(len(md_doc)):\n",
    "            md_doc[i].metadata = md_doc[i].metadata | doc.metadata \n",
    "        md_docs.extend(md_doc)\n",
    "    \n",
    "    # RecursiveTextSplitter\n",
    "    from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "    # Chunk size big enough\n",
    "    splitter = RecursiveCharacterTextSplitter(\n",
    "        chunk_size=500,\n",
    "        chunk_overlap=20,\n",
    "        separators=[\"\\n\\n\", \"\\n\", \"(?<=\\. )\", \" \", \"\"]\n",
    "    )\n",
    "    \n",
    "    splitted_docs = splitter.split_documents(md_docs)\n",
    "    return splitted_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "02123f84-574b-4728-bd35-5a2f0fc45afd",
   "metadata": {},
   "outputs": [],
   "source": [
    "chunks = my_custom_splitter(docs)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b39139f8-23d5-4dbf-86b5-af683a4affb0",
   "metadata": {},
   "source": [
    "# 3. Embeddings & Vector DB "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "89d8c144-8cfe-4d15-a2da-12518c89dfde",
   "metadata": {},
   "outputs": [],
   "source": [
    "persist_directory = './db/chroma'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "5f9d581f-308b-4998-abce-05ee7943df45",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Embeddings\n",
    "from langchain.embeddings import OpenAIEmbeddings\n",
    "embeddings = OpenAIEmbeddings()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "75d3eec1-b43a-4619-a4fd-eb0c442fd36b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import shutil\n",
    "try:\n",
    "    shutil.rmtree(persist_directory)\n",
    "except FileNotFoundError as e:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "094d662a-736e-4a5b-bf52-0329d78b9a41",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save db \n",
    "from langchain.vectorstores import Chroma\n",
    "db = Chroma.from_documents(chunks, embeddings, persist_directory=persist_directory)\n",
    "db.persist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ee003705-82a0-4663-ad4f-68a0c27e0f41",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "112"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Count the number of chunks in the vector store\n",
    "db._collection.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a3c6ed5a-6564-43f9-8c43-df1c7587cdd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# db.get()\n",
    "retriever = db.as_retriever()\n",
    "# retriever = db.as_retriever(search_type=\"similarity_score_threshold\", search_kwargs={\"k\": 5, \"score_threshold\": 0.3})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c87308ae-214d-4d74-acb8-c1d36078c9fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.prompts import PromptTemplate\n",
    "template = \"\"\"Given this text extracts:\n",
    "    -----\n",
    "    {context}\n",
    "    -----\n",
    "    Please answer with to the following question:\n",
    "    Question: {question}\n",
    "    Answer: \n",
    "    \"\"\"\n",
    "\n",
    "prompt = PromptTemplate(template=template, input_variables=[\"context\", \"question\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "f4460250-19cd-4bbe-9c6a-12007f60273d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# LLM\n",
    "from langchain.llms import OpenAI  \n",
    "llm = OpenAI(streaming=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "729e0c47-4f3b-4312-900d-46ee492e856f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA\n",
    "\n",
    "chain_type_kwargs = {\"prompt\": prompt}\n",
    "\n",
    "qa = RetrievalQA.from_chain_type(\n",
    "    llm=llm,\n",
    "    chain_type=\"stuff\", # or \n",
    "    retriever=retriever,\n",
    "    return_source_documents=True,\n",
    "    verbose=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "f60d7e1a-70ab-49ff-a127-7269e7ddc4cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "question = \"Comment accéder à mon comité d'entreprise ? \"\n",
    "\n",
    "query = {\"query\": question}\n",
    "answer = qa(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "ad2b5066-f323-437c-bf2f-86c6e65c715d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       " Vous pouvez accéder à votre Comité d'Entreprise en consultant l'adresse suivante: <https://mon-CE.fr>. Si vous n'avez pas vos identifiants, vous pouvez envoyer un mail à [xxxx@mon-ce.fr](mailto:xxxx@mon-ce.fr). Renseignez les identifiants sur le site du CE et vous pourrez bénéficier de nombreux avantages."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display_markdown\n",
    "display_markdown(answer[\"result\"], raw=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3684090-1e06-4281-a3f8-a629989701a3",
   "metadata": {},
   "source": [
    "### Display documents used by the LLM for answering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "f813848c-a6dd-44ca-a1e2-c37a3463e54d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='Pour accéder au CE, vous pouvez consultant l’adresse suivante: <https://mon-CE.fr>  \\nSi vous n’avez pas vos identifiants, vous pouvez envoyer un mail à [xxxx@mon-ce.fr](mailto:xxxx@mon-ce.fr), le responsable du comité d’entreprise.  \\nRenseignez les identifiants sur le site du CE et vous pourrez bénéficier de nombreux avantages.', metadata={'Sous-titre 1': 'Comment accéder à mon CE ?', 'title': \"Comité d'entreprise (CE) - Définition et rôles\", 'id': '1933313', 'source': 'https://florianbastin.atlassian.net/wiki/spaces/~70121e1c1cf2b203a49dabc6762c43bdbfe05/pages/1933313'}),\n",
       " Document(page_content=\"Le Comité d'Entreprise est chargé de veiller au respect des droits des salariés en matière de travail, de sécurité, de santé et de conditions de travail. Il peut être consulté par la direction de l'entreprise sur différentes questions liées à l'organisation du travail, aux licenciements collectifs, aux restructurations, etc. Il est également informé des projets de l'entreprise et peut émettre des avis.\", metadata={'Sous-titre 1': \"Rôle du Comité d'Entreprise :\", 'Sous-titre 2': '1. Défense des droits des salariés :', 'title': \"Comité d'entreprise (CE) - Définition et rôles\", 'id': '1933313', 'source': 'https://florianbastin.atlassian.net/wiki/spaces/~70121e1c1cf2b203a49dabc6762c43bdbfe05/pages/1933313'}),\n",
       " Document(page_content=\"Le Comité d'Entreprise représente les intérêts des salariés auprès de la direction de l'entreprise. Il est un lieu d'échange et de dialogue entre les employés et l'employeur, favorisant ainsi un climat social constructif.\", metadata={'Sous-titre 1': \"Rôle du Comité d'Entreprise :\", 'Sous-titre 2': '5. Représentation des salariés :', 'title': \"Comité d'entreprise (CE) - Définition et rôles\", 'id': '1933313', 'source': 'https://florianbastin.atlassian.net/wiki/spaces/~70121e1c1cf2b203a49dabc6762c43bdbfe05/pages/1933313'}),\n",
       " Document(page_content=\"Le Comité d'Entreprise (CE) est une institution représentative du personnel présente dans les entreprises françaises. Il a été créé pour assurer la représentation des salariés et leur permettre de participer activement aux décisions concernant leur vie au sein de l'entreprise. Le Comité d'Entreprise est obligatoire dans les entreprises de certaines tailles et ses missions sont définies par le Code du Travail.\", metadata={'Sous-titre 1': \"Qu'est-ce qu'un Comité d'Entreprise ?\", 'title': \"Comité d'entreprise (CE) - Définition et rôles\", 'id': '1933313', 'source': 'https://florianbastin.atlassian.net/wiki/spaces/~70121e1c1cf2b203a49dabc6762c43bdbfe05/pages/1933313'})]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "retriever.get_relevant_documents(\"Comment accéder à mon comité d'entreprise ?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b45f76bc-6df7-4184-8044-1f509f625fa9",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "RAG",
   "language": "python",
   "name": "rag"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
